package com.hotdog.plugin.util;

import com.intellij.openapi.projectRoots.JavaSdkType;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.ProjectRootManager;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.management.ManagementFactory;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 摘自arthas源码
 * @Author wangzhengnian
 * @Date 2021/3/20 14:39
 * @Version 1.0
 */
public class ProcessUtil {

    public ProcessUtil() {
    }
//    public static void main(String[] args) {
//        File file=new File("/Users/wangzhengnian/develop/company/kkgo/kkgo-migrate-server/target/classes/com/melot/migrate/controller/UserTokenController.class");
//        System.out.println(file.lastModified());
//        System.out.println(new Date(file.lastModified()));
//        Map<String, String> map = getAllJavaPid();
////        for (Map.Entry<String, String> obj : map.entrySet()) {
////            System.out.println(obj.getKey());
////            System.out.println(obj.getValue());
////        }
//    }

    /**
     * 获取所有java进程
     *
     * @return
     * @param javaHome
     */
    public static Map<String, String> getAllJavaPid(String javaHome) {
        String[] paths = {"bin/jps", "bin/jps.exe", "../bin/jps", "../bin/jps.exe"};
        File file = null;
        for (String path : paths) {
            File jpsFile = new File(javaHome, path);
            if (jpsFile.exists()) {
                file = jpsFile;
            }
        }
//        javaHome = System.getenv("JAVA_HOME");
//        for (String path : paths) {
//            File jpsFile = new File(javaHome, path);
//            if (jpsFile.exists()) {
//                file = jpsFile;
//            }
//        }
        if (null == file) {
            throw new RuntimeException("jdk error");
        }
        String jps = file.getAbsolutePath();
        String[] command = new String[]{jps, "-l"};
        List<String> lines = runNative(command);
        Map<String, String> map = new HashMap<>();
        for (String line : lines) {
            String[] splits = line.trim().split("\\s+");
            if (splits.length < 2) {
                continue;
            }
            map.put(splits[0], splits[1]);
        }
        String currentPid = getCurrentPid();
        map.remove(currentPid);
        return map;
    }


//    /**
//     * 获取所有java进程
//     *
//     * @return
//     */
//    public static Map<String, String> getAllJavaPidByJpsJar() {
//        String[] command = new String[]{"-l"};
//        List<String> lines = runJps(command);
//        if(CollectionUtils.isEmpty(lines)){
//            HotMessagesUtil.showError("未发现java程序");
//        }
//        Map<String, String> map = new HashMap<>();
//        for (String line : lines) {
//            String[] splits = line.trim().split("\\s+");
//            if (splits.length < 2) {
//                continue;
//            }
//            map.put(splits[0], splits[1]);
//        }
//        String currentPid = getCurrentPid();
//        map.remove(currentPid);
//        return map;
//    }
//
//    private static List<String> runJps(String[] var0) {
//        Arguments arguments=null;
//        List<String> lines= Lists.newArrayList();
//        try {
//            arguments = new Arguments(var0);
//        } catch (IllegalArgumentException var20) {
//            throw new RuntimeException();
//        }
//
//        try {
//            HostIdentifier var1 = arguments.hostId();
//            MonitoredHost var25 = MonitoredHost.getMonitoredHost(var1);
//            Set var3 = var25.activeVms();
//            Iterator var4 = var3.iterator();
//
//            while(true) {
//                while(var4.hasNext()) {
//                    Integer var5 = (Integer)var4.next();
//                    StringBuilder var6 = new StringBuilder();
//                    Object var7 = null;
//                    int var8 = var5;
//                    var6.append(String.valueOf(var8));
//                    if (arguments.isQuiet()) {
//                        System.out.println(var6);
//                    } else {
//                        MonitoredVm var9 = null;
//                        String var10 = "//" + var8 + "?mode=r";
//                        String var11 = null;
//
//                        try {
//                            var11 = " -- process information unavailable";
//                            VmIdentifier var12 = new VmIdentifier(var10);
//                            var9 = var25.getMonitoredVm(var12, 0);
//                            var11 = " -- main class information unavailable";
//                            var6.append(" " + MonitoredVmUtil.mainClass(var9, arguments.showLongPaths()));
//                            String var13;
//                            if (arguments.showMainArgs()) {
//                                var11 = " -- main args information unavailable";
//                                var13 = MonitoredVmUtil.mainArgs(var9);
//                                if (var13 != null && var13.length() > 0) {
//                                    var6.append(" " + var13);
//                                }
//                            }
//
//                            if (arguments.showVmArgs()) {
//                                var11 = " -- jvm args information unavailable";
//                                var13 = MonitoredVmUtil.jvmArgs(var9);
//                                if (var13 != null && var13.length() > 0) {
//                                    var6.append(" " + var13);
//                                }
//                            }
//
//                            if (arguments.showVmFlags()) {
//                                var11 = " -- jvm flags information unavailable";
//                                var13 = MonitoredVmUtil.jvmFlags(var9);
//                                if (var13 != null && var13.length() > 0) {
//                                    var6.append(" " + var13);
//                                }
//                            }
//
//                            var11 = " -- detach failed";
//                            var25.detach(var9);
//                            lines.add(var6.toString());
//                            var11 = null;
//                        } catch (URISyntaxException var21) {
//                            var7 = var21;
//
//                            assert false;
//                        } catch (Exception var22) {
//                            var7 = var22;
//                        } finally {
//                            if (var11 != null) {
//                                var6.append(var11);
//                                if (arguments.isDebug() && var7 != null && ((Throwable)var7).getMessage() != null) {
//                                    var6.append("\n\t");
//                                    var6.append(((Throwable)var7).getMessage());
//                                }
//
//                                System.out.println(var6);
//                                if (arguments.printStackTrace()) {
//                                    ((Throwable)var7).printStackTrace();
//                                }
//                                continue;
//                            }
//                        }
//                    }
//                }
//                return lines;
//            }
//        } catch (MonitorException var24) {
//            if (var24.getMessage() != null) {
//                System.err.println(var24.getMessage());
//            } else {
//                Throwable var2 = var24.getCause();
//                if (var2 != null && var2.getMessage() != null) {
//                    System.err.println(var2.getMessage());
//                } else {
//                    var24.printStackTrace();
//                }
//            }
//        }
//        return null;
//    }


    /**
     * 获取当前进程pid
     * @return 当前进程pid
     */
    public static String getCurrentPid() {
        String name = ManagementFactory.getRuntimeMXBean().getName();
        String pid = name.split("@")[0];
        return pid;
    }

    public static List<String> runNative(String[] cmdToRunWithArgs) {
        Process p = null;
        try {
            p = Runtime.getRuntime().exec(cmdToRunWithArgs);
        } catch (Exception e) {
            e.printStackTrace();
        }

        ArrayList<String> sa = new ArrayList<>();
        BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
        try {
            String line;
            while ((line = reader.readLine()) != null) {
                sa.add(line);
            }
            p.waitFor();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sa;
    }
}
